home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / network / admin / xinetd.2 / xinetd / xinetd.2.1.7-linux.4 / libs / src / str / strutil.c < prev   
Encoding:
C/C++ Source or Header  |  1993-07-25  |  3.5 KB  |  189 lines

  1. /*
  2.  * (c) Copyright 1992, 1993 by Panagiotis Tsirigotis
  3.  * All rights reserved.  The file named COPYRIGHT specifies the terms 
  4.  * and conditions for redistribution.
  5.  */
  6.  
  7. static char RCSid[] = "$Id: strutil.c,v 3.1 1993/06/13 02:50:22 panos Exp $" ;
  8.  
  9.  
  10. #include <ctype.h>
  11.  
  12. #define NULL                0
  13.  
  14.  
  15. #ifndef TRIVIAL_STR_FIND
  16.  
  17. /*
  18.  * look for an instance of s2 in s1
  19.  * Returns a pointer to the beginning of s2 in s1
  20.  */
  21. char *str_find( str, sstr )
  22.     register char *str ;
  23.     register char *sstr ;
  24. {
  25.    register int ssfc = *sstr++ ;    /* sub-string first char */
  26.  
  27.     if ( ssfc == 0 )            /* empty string is always a match */
  28.         return( str ) ;
  29.  
  30.     while ( *str )
  31.     {
  32.         char *current = str ;
  33.         register int strc = *str++ ;
  34.         register char *sp ;                    /* string pointer */
  35.         register char *ssp ;                   /* sub-string pointer */
  36.  
  37.         if ( strc != ssfc )
  38.             continue ;
  39.         
  40.         /*
  41.          * We don't need to make the end of str a special case since
  42.          * the comparison of *sp against *ssp is guaranteed to fail
  43.          */
  44.         for ( sp = str, ssp = sstr ;; sp++, ssp++ )
  45.         {
  46.             if ( *ssp == 0 )
  47.                 return( current ) ;
  48.             if ( *sp != *ssp )
  49.                 break ;
  50.         }
  51.     }
  52.  
  53.     return( 0 ) ;
  54. }
  55.  
  56.  
  57. #define LOWER_CASE( c )                    ( (c) + 'a' - 'A' )
  58.  
  59. /*
  60.  * str_casefind is similar to str_find except that it ignores the
  61.  * case of the alphabetic characters
  62.  */
  63. char *str_casefind( str, sstr )
  64.     register char *str ;
  65.     char *sstr ;
  66. {
  67.     register int ssfc = *sstr++ ;        /* sub-string first char */
  68.  
  69.     if ( ssfc == 0 )
  70.         return( str ) ;
  71.  
  72.     if ( isalpha( ssfc ) && isupper( ssfc ) )
  73.         ssfc = LOWER_CASE( ssfc ) ;
  74.  
  75.     while ( *str )
  76.     {
  77.         char *current = str ;
  78.         register int strc = *str++ ;
  79.         char *sp ;                            /* string pointer */
  80.         char *ssp ;                            /* sub-string pointer */
  81.  
  82.         if ( isalpha( strc ) && isupper( strc ) )
  83.             strc = LOWER_CASE( strc ) ;
  84.         if ( strc != ssfc )
  85.             continue ;
  86.         
  87.         for ( sp = str, ssp = sstr ;; sp++, ssp++ )
  88.         {
  89.             register int sc = *sp ;                /* string char */
  90.             register int ssc = *ssp ;            /* substring char */
  91.  
  92.             /*
  93.              * End-of-substring means we got a match
  94.              */
  95.             if ( ssc == 0 )
  96.                 return( current ) ;
  97.  
  98.             /*
  99.              * Convert to lower case if alphanumeric
  100.              */
  101.             if ( isalpha( sc ) && isupper( sc ) )
  102.                 sc = LOWER_CASE( sc ) ;
  103.             if ( isalpha( ssc ) && isupper( ssc ) )
  104.                 ssc = LOWER_CASE( ssc ) ;
  105.             if ( sc != ssc )
  106.                 break ;
  107.         }
  108.     }
  109.  
  110.     return( 0 ) ;
  111. }
  112.  
  113.  
  114. #else        /* defined( TRIVIAL_STR_FIND ) */
  115.  
  116. /*
  117.  * look for an instance of s2 in s1
  118.  * Returns a pointer to the beginning of s2 in s1
  119.  */
  120. char *str_find( s1, s2 )
  121.     char *s1 ;
  122.     char *s2 ;
  123. {
  124.    int i ;
  125.    int l1 = strlen( s1 ) ;
  126.    int l2 = strlen( s2 ) ;
  127.  
  128.    for ( i = 0 ; i < l1 - l2 + 1 ; i++ )
  129.       if ( strncmp( &s1[ i ], s2, l2 ) == 0 )
  130.          return( &s1[ i ] ) ;
  131.    return( NULL ) ;
  132. }
  133.  
  134.  
  135. char *str_casefind( s1, s2 )
  136.     char *s1 ;
  137.     char *s2 ;
  138. {
  139.    int i ;
  140.    int l1 = strlen( s1 ) ;
  141.    int l2 = strlen( s2 ) ;
  142.  
  143.    for ( i = 0 ; i < l1 - l2 + 1 ; i++ )
  144.       if ( strncasecmp( &s1[ i ], s2, l2 ) == 0 )
  145.          return( &s1[ i ] ) ;
  146.    return( NULL ) ;
  147. }
  148.  
  149. #endif     /* TRIVIAL_STR_FIND */
  150.  
  151.  
  152. /*
  153.  * Fill string s with character c
  154.  */
  155. void str_fill( s, c )
  156.     register char *s ;
  157.     register char c ;
  158. {
  159.     while ( *s ) *s++ = c ;
  160. }
  161.  
  162.  
  163. char *str_lower( s )
  164.     char *s ;
  165. {
  166.     register char *p ;
  167.     register int offset = 'a' - 'A' ;
  168.  
  169.     for ( p = s ; *p ; p++ )
  170.         if ( isascii( *p ) && isupper( *p ) )
  171.             *p += offset ;
  172.     return( s ) ;
  173. }
  174.  
  175.  
  176. char *str_upper( s )
  177.     char *s ;
  178. {
  179.     register char *p ;
  180.     register int offset = 'a' - 'A' ;
  181.  
  182.     for ( p = s ; *p ; p++ )
  183.         if ( isascii( *p ) && islower( *p ) )
  184.             *p -= offset ;
  185.     return( s ) ;
  186. }
  187.  
  188.  
  189.